#pragma once

#include "log.hpp"
#include <iostream>
#include <string>
#include <cassert>
#include <pthread.h>
#include <unistd.h>

typedef void *(*func_t)(void *);    // 对函数指针类型重定义

// 线程参数
class ThreadData
{
public:
    std::string _name;
    void *_args;
};

class Thread
{
public:
    Thread(int num, func_t func, void* args)
        : _num(num)
        , _func(func)
    { 
        _thread_data._name += "Thread ";
        _thread_data._name += std::to_string(num);
        _thread_data._args = args;
    }

    // 创建线程
    void start()
    {
        int n = pthread_create(&_id, nullptr, _func, (void*)&_thread_data);
        assert(n == 0);
        (void)n;
    }

    // 等待线程
    void join()
    {
        int n = pthread_join(_id, nullptr);
        assert(n == 0);
        (void)n;
    }

    // 获取线程名称函数
    std::string name()
    {
        return _thread_data._name;
    }

    // 析构函数
    ~Thread()
    {
        join();
    }

private:
    int _num;                 // 线程编号
    pthread_t _id;            // 线程id
    func_t _func;             // 线程函数
    ThreadData _thread_data;  // 线程数据
};